let o = {}; // 一开始没有任何属性
// 创建一个不可枚举的数据属性x，值为1
Object.defineProperty(o, "x", {
  value: 1,
  writable: true,
  enumerable: false,
  configurable: true,
});
// 确认已经有了 x 属性
console.log(o.x); // 1
// 但该属性不可枚举
console.log(Object.keys(o)); // []
// 目前 x 属性是可写的
o.x = 2;
console.log(o.x); // 2
// 将属性 x 修改为只读
Object.defineProperty(o, "x", { writable: false });
// o.x = 3; // 抛出错误 TypeError

// 这个属性依然是可以配置的，因此可以像这样修改它的值
Object.defineProperty(o, "x", { value: 3 });
console.log(o.x); // 3

// 将 x 由数据属性修改为访问器属性
Object.defineProperty(o, "x", {
  get: function () {
    return 10;
  },
});
console.log(o.x); // 10
